package subjectlist;


import java.beans.beancontext.BeanContext;

/**
 * 题目描述：
 * 编写一个截取字符串的函数，输入为一个字符串和字节数，输出为按字节截取的字符串。
 * 但是要保证汉字不被截半个，例如“人ABC”4，应该截为"人AB"，输入“人ABC们DEF”，
 * 6，应该输出为“人ABC”而不是“人ABC”+“们”的半个
 */
public class V如何截取包含中文的字符串 {


    /**
     * 在Java语言中，默认使用的Unicode编码方式，即每个字符占用两个字节，
     * 因此，可以用来存储中文。虽然String是由char所组成的，但是它采用了一种更加灵活的方式来存储，即英文占用一个字符，
     * 中文占用两个字符，采用这种存储方式的一个重要作用就是可以减少所需的存储空间，提高存储效率。
     * 根据这个特点，可以采用如下代码来完成本题的要求
     */
    public static boolean isChinese(char c){
        String sb=String.valueOf(c);
        return sb.getBytes().length>1;
    }

    public String truncateStr(String str,int len){
        if (str == null || str.equals("") || len == 0) {
            return "";
        }
        char[] chrArr=str.toCharArray();
        StringBuilder sb=new StringBuilder("");
        //用来记录当前截取字符串的长度
        int count=0;
        for(char cc:chrArr){
            if (count < len) {
                if (isChinese(cc)) {
                    //如果要求截取子串的长度只差一个字符，但是接下来的字符是中文
                    //则截取结果子串中不保存在这个中文字符
                    if(count+1==len){
                        return sb.toString();
                    }
                    count=count+2;
                    sb=sb.append(cc);
                }else {
                    count=count+1;
                    sb=sb.append(cc);
                }
            }else {
                break;
            }
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        V如何截取包含中文的字符串 splitStr=new V如何截取包含中文的字符串();
        String sb="人ABC们DEF";
        System.out.println(splitStr.truncateStr(sb,5));
        System.out.println(splitStr.truncateStr(sb,4));
    }
}
